<?php
/* Nueva clase para manejo de DB creada por Vcoud.com
 * Permite el manejo de la DB de manera más segura sin inyección de código
 * Gracias a la función Bind
 */
class Database{
    private $host      = 'localhost';
    private $user      = 'root';
    private $pass      = 'root';
    private $dbname    = 'siadcos';
 
    private $dbh;
    public $error;
    
    private $stmt;
    /** Al momento que se genera la BD, la misma en su construcción establece
     * la conexión dependiendo de los parámetros anteriormente establecidos.
     */
    public function __construct(){
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        $options = array(
            PDO::ATTR_PERSISTENT            => true,
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
            PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8"
        );
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
    /**
     * Función que prepara la Cadena SQL.
     * @param string $query Cadena que se preparará para la ejecución en SQL.
     * Se debe colocar antecediendo con ":" aquellas variables
     * que se pasarán a través de la función bind, como por ejemplo ":usuario".
     */
    public function query($query)
    {
        $this->stmt = $this->dbh->prepare($query);
    }
    /** Función que permite la prevención de la inyecciones por SQL.
     * @param string $parametro Parámetro que se usará para la transformación
     * como por ejemplo ":usuario".
     * @param type $valor Valor que tendrá el parámetro.
     * @param type $tipo Tipo de parámetro. No es obligatorio.
     */
    public function bind($parametro, $valor, $tipo = null){
        if (is_null($tipo)) {
          switch (true) {
            case is_int($valor):
              $tipo = PDO::PARAM_INT;
              break;
            case is_bool($valor):
              $tipo = PDO::PARAM_BOOL;
              break;
            case is_null($valor):
              $tipo = PDO::PARAM_NULL;
              break;
            default:
              $tipo = PDO::PARAM_STR;
          }
        }
        $this->stmt->bindValue($parametro, $valor, $tipo);
    }
    /** Ejecuta la candena SQL ya ateriormente preparada con query */
    public function ejecutar(){
        return $this->stmt->execute();
    }
    /** Obtiene todos los datos de una cadena SQL sentenciada
     * anteriomente con query($query)
     */
    public function resultados(){
        $this->ejecutar();
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /** Obtiene un solo dato de una cadena SQL sentenciada
     * anteriomente con query($query)
     */
    public function simple(){
        $this->ejecutar();
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
        
    }
    /** Realiza el conteo de las filas, luego de un resultados() */
    public function contFilas(){
        return $this->stmt->rowCount();
    }
    /** Devuelve el ultimo id insertado */
    public function ultimoIdInsertado(){
        return $this->dbh->lastInsertId();
    }
    /** Inicia una transaccion para realizar multiples ejecuciones
     * hacia la base de datos SQL, se debe llamar terminarTransaccion()
     * para que se ejecuten todas y se termine la misma
     */
    public function iniciarTransaccion(){
        return $this->dbh->beginTransaction();
    }
    /** Realiza los cambios y termina una transaccion ya anteriormente iniciada
     */    
    public function terminarTransaccion(){
        return $this->dbh->commit();
    }
    /** Hace un rollback de los cambios y cancela la transaccion
     * anteriormente iniciada
     */
    public function cancelarTransaccion(){
        return $this->dbh->rollBack();
    }
    /** Función para debuggear las sentencias preparadas para SQL */
    public function debugDumpParams(){
        return $this->stmt->debugDumpParams();
    }
}

/* Created by Vcoud */
